{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#ASCII，Unicode和UTF-8\n",
    "\n",
    "#ASCII码：\n",
    "美国制定了一套字符编码，对英语字符与二进制位之间的关系，做了统一规定。这被称为ASCII码，一直沿用至今。\n",
    "\n",
    "在计算机内部，所有的信息最终都表示为一个二进制的字符串。每一个二进制位（bit）有0和1两种状态，因此八个二进制位就可以组合出256种状态，这被称为一个字节（byte）。也就是说，一个字节一共可以用来表示256种不同的状态，每一个状态对应一个符号，就是256个符号，从0000000到11111111。\n",
    "\n",
    "ASCII码一共规定了128个字符的编码，比如空格\"SPACE\"是32（二进制00100000），大写的字母A是65（二进制01000001）。这128个符号（包括32个不能打印出来的控制符号），只占用了一个字节的后面7位，最前面的1位统一规定为0。\n",
    "\n",
    "\n",
    "#Unicode码\n",
    "世界上存在着多种编码方式，同一个二进制数字可以被解释成不同的符号。因此，要想打开一个文本文件，就必须知道它的编码方式，否则用错误的编码方式解读，就会出现乱码。如果有一种编码，将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码，那么乱码问题就会消失。这就是Unicode，就像它的名字都表示的，这是一种所有符号的编码。\n",
    "\n",
    "Unicode只是一个符号集，它只规定了符号的二进制代码，却没有规定这个二进制代码应该如何存储。\n",
    "\n",
    "#UTF-8\n",
    "UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16（字符用两个字节或四个字节表示）和UTF-32（字符用四个字节表示），不过在互联网上基本不用。重复一遍，这里的关系是，UTF-8是Unicode的实现方式之一。\n",
    "\n",
    "#str与Unicode都是basestring的子类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Encoded String: dGhpcyBpcyBzdHJpbmcgZXhhbXBsZS4uLi53b3chISE=\n",
      "\n"
     ]
    }
   ],
   "source": [
    "#语法 str.encode(encoding='UTF-8',errors='strict')\n",
    "str = \"this is string example....wow!!!\";\n",
    "print \"Encoded String: \" + str.encode('base64','strict')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Encoded String: dGhpcyBpcyBzdHJpbmcgZXhhbXBsZS4uLi53b3chISE=\n",
      "\n",
      "Decoded String: this is string example....wow!!!\n"
     ]
    }
   ],
   "source": [
    "#语法 Str.decode(encoding='UTF-8',errors='strict')\n",
    "Str = \"this is string example....wow!!!\";\n",
    "Str = Str.encode('base64','strict');\n",
    "\n",
    "print \"Encoded String: \" + Str\n",
    "print \"Decoded String: \" + Str.decode('base64','strict')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#一般的方法是 str-->unicode-->需要编码方式\n",
    "unicode码相当于一个中介，通过Unicode的中转实现不同编码方式的转换"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#在IDE中使用print时，有错误，旺旺是输出的字符串的编码方式与IDE默认的字符编码方式不一致造成的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'UTF-8'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看系统默认的编码方式\n",
    "import sys\n",
    "sys.stdout.encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#申明的方法\n",
    "# -*- coding: utf-8 -*- 或者 #coding=utf-8 \n",
    "若头部声明coding=utf-8, a = ‘中文‘ 其编码为utf-8\n",
    "\n",
    "若头部声明coding=gb2312, a = ‘中文‘ 其编码为gbk\n",
    "\n",
    "同一项目中所有源文件头部统一一个编码,并且声明的编码要和源文件保存的编码一致(编辑器相关)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#判断是str还是Unicode的方法\n",
    "isinstance(s,str)\n",
    "isinstance(s,unicode)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [default]",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
